home *** CD-ROM | disk | FTP | other *** search
/ Just Call Me Internet / Just Call Me Internet.iso / prog / atari / c / stik_dev / forecast / main.c < prev    next >
C/C++ Source or Header  |  1996-01-09  |  8KB  |  362 lines

  1. #include <aes.h>
  2. #include <vdi.h>
  3. #include <osbind.h>
  4. #include <stdio.h>
  5. #include <stdlib.h>
  6. #include "forecast.h"
  7. #include "main.h"
  8.  
  9. #include "transprt.h"
  10.  
  11. /*    Definitions...    */
  12.  
  13. #define MAXHOSTNAMELEN    64
  14.  
  15. /*    Prototypes...    */
  16.  
  17.     void    main(void);
  18.     void    gem_init(void);
  19.     void    gem_close(void);
  20.     void    init_rsrc(void);
  21.  
  22. /*    Externals...    */
  23.  
  24.     extern void    init_mfdb(void);
  25.     extern void    close_mfdb(void);
  26.     
  27.     extern void    draw_win(void);
  28.     extern void    create_win(const char *);
  29.     extern void    close_win(void);
  30.     extern void    delete_win(void);
  31.     extern short    do_menu(short);
  32.     extern short    dialog(OBJECT *, short);
  33.  
  34.     extern void    draw_template(void);
  35.     extern void    draw_thermometer(short);
  36.     extern void    draw_barometer(short, short);
  37.     extern void    draw_humidity(short);
  38.     extern void    draw_wind(char *, short);
  39.  
  40.     extern int    open_socket(char *, int);
  41.     extern int    close_socket(int);
  42.     extern int    read_from_socket(int, char *, int);
  43.     extern int    send_to_socket(int, char *, int);
  44.  
  45.     extern int    initialise(void);
  46.  
  47. /*    Globals...        */
  48.  
  49.     /*    AES/VDI...    */
  50.  
  51.     short     ap_id;
  52.     short    vdi_handle;
  53.     short    work_in[11] = {1,1,1,1,1,1,1,1,1,1,2};
  54.     short    work_out[57], extn_out[57];
  55.     short aes_version;
  56.     char program_title[] = "  Forecast v. 0.4  ";
  57.  
  58.     /*    Resource...    */
  59.  
  60.     OBJECT *menu_ptr, *about_ptr, *loc_ptr, *help_ptr;
  61.  
  62.     /*    MFDB...        */
  63.     
  64.     MFDB    work, screen;
  65.  
  66.     /*    Window...    */
  67.     
  68.     WINDOW    win;
  69.  
  70.     /* File IO */
  71.  
  72.     char    filename[128];
  73.     char    filepath[128];   
  74.     char     program_dir[128];
  75.  
  76.  
  77.     /*    Program Flow...    */
  78.     
  79.     short endmainloop;
  80.     short open=0;
  81.     int   did_stik_init = 0;    
  82.     char city_tla[3];
  83.  
  84.  
  85. /*    Procedures...    */
  86.  
  87. void    main(void)
  88.     {
  89.     short junk, event, scan, msg[8];
  90. /*    struct sockaddr_in    soc_address, *sin = &soc_address;
  91.     struct hostent        *hp;
  92.     char            *hostname, hnamebuf[MAXHOSTNAMELEN];
  93.     char            *cityname;
  94.     char            weatherhost[]="um-weather.sprl.umich.edu";*/
  95.     char            *ptr, *ptr2, *temp, *baro_p, *baro_dec, *humid, *wind_dir, *wind;
  96.     char            *buff;
  97.     char            message[64]; /* Scratch buffer for alert */
  98.     int            s;
  99.     short            i, j;
  100.  
  101.     gem_init();
  102.     init_mfdb();
  103.     draw_template();
  104.     create_win("AtariForecast");
  105.  
  106. /*    wind_info(win.handle, "Loading Map Data");*/
  107. /*    wind_info(win.handle, "Initializing Identity Matricies");*/
  108.  
  109.     graf_mouse(ARROW, NULL);
  110.     did_stik_init = init_network();
  111.  
  112.     do
  113.         {
  114.         event = evnt_multi(MU_MESAG | MU_KEYBD,
  115.                 0, 0, 0,
  116.                 0, 0, 0, 0, 0,
  117.                 0, 0, 0, 0, 0,
  118.                 msg,
  119.                 0, 0,
  120.                 &junk, &junk, &junk, &junk, &scan, &junk);
  121.  
  122.         if (MU_MESAG & event)
  123.             {
  124.             if (msg[0]==MN_SELECTED)
  125.                 {
  126.                 wind_update(BEG_UPDATE);
  127.                 endmainloop=do_menu(msg[4]);
  128.                 menu_tnormal(menu_ptr, msg[3], 1);
  129.                 wind_update(END_UPDATE);
  130.                 }
  131.  
  132.             switch (msg[0])
  133.                 {
  134.                 case WM_TOPPED:
  135.                     if (win.handle==msg[3])
  136.                         {
  137.                         wind_set(win.handle, WF_TOP, &junk, &junk, &junk, &junk);
  138.                         }
  139.                 break;
  140.  
  141.                 case WM_CLOSED:
  142.                     if (win.handle==msg[3])    endmainloop=TRUE;
  143.                 break;
  144.  
  145.                 case WM_MOVED:
  146.                     if (win.handle==msg[3])
  147.                         {
  148.                         wind_set(win.handle, WF_CXYWH, msg[4], msg[5], msg[6], msg[7]);
  149.                         win.b_rect.g_x=msg[4];
  150.                         win.b_rect.g_y=msg[5];
  151.                         win.b_rect.g_w=msg[6];
  152.                         win.b_rect.g_h=msg[7];
  153.                         wind_calc(WC_WORK, WINTYPE, msg[4], msg[5], msg[6], msg[7],
  154.                                     &win.w_rect.g_x, &win.w_rect.g_y,
  155.                                     &win.w_rect.g_w, &win.w_rect.g_h);
  156.                         }
  157.                 break;
  158.  
  159.                 case WM_REDRAW:
  160.                     if (win.handle==msg[3])    draw_win();
  161.                 break;
  162.                 }
  163.             }
  164.  
  165.         if (MU_KEYBD & event)
  166.             {
  167.             switch (scan)
  168.                 {
  169.                 case 0x180F:
  170.                     open=0x01;
  171.                     break;
  172.  
  173.                 case 0x1011:
  174.                     endmainloop=TRUE;
  175.                     break;
  176.  
  177.                 case 0x6200:
  178.                     /* help */
  179.                     dialog(help_ptr,0);
  180.                     break;
  181.  
  182.                 case 0x0F09:
  183.                     /* Tab - about */
  184.                     dialog(about_ptr,0);
  185.                     break;
  186.                 }
  187.             }
  188.  
  189.         if (open==0x01)
  190.             {
  191.             bzero(message, sizeof(message));
  192.             clear_mfdb(&work);
  193.             draw_template();
  194.  
  195.             read_prefs_file(filename);
  196.  
  197.             dialog(loc_ptr, city);
  198.             strcpy(city_tla, ((TEDINFO *)(loc_ptr[city].ob_spec))->te_ptext);
  199.  
  200.             write_prefs_file(filename);
  201.  
  202.             strcpy(message, ((TEDINFO *)(loc_ptr[city].ob_spec))->te_ptext);
  203.             message[3]=13;
  204.             message[4]=10;
  205.             message[5]=0;
  206.  
  207.             if (did_stik_init != TRUE)
  208.                 {
  209.                     did_stik_init = init_network();
  210.                 }
  211.  
  212.             if (did_stik_init == TRUE)
  213.                 {
  214.                     buff = KRmalloc((long)2000);   /* That should be enough    */
  215.  
  216.                     if (buff == (char *)NULL) 
  217.                         {
  218.                             strcpy(message, "[1][");
  219.                             strcat(message, "Can't allocate line buffer|for Forecast!");
  220.                             strcat(message, "][  OK  ]");
  221.                             form_alert(1, message);
  222.                             return;
  223.                         }
  224.  
  225.                     bzero(buff, sizeof(buff));
  226.  
  227.                     s=open_socket("um-weather.sprl.umich.edu", 3000);
  228.                     read_from_socket(s, NULL, 0);
  229.                     send_to_socket(s, message, 5);
  230.                     read_from_socket(s, buff, 2048);
  231.                     close_socket(s);
  232.  
  233.                     for (i=0; ((buff[i]!='=') && (i<2048)); i++);
  234.                     ptr=&buff[i];
  235.                     for (; ((buff[i]!=13) && (i<2048)); i++);
  236.                     ptr=&buff[i];
  237.                     for (i++; ((buff[i]!=13) && (i<2048)); i++);
  238.                     buff[--i]=0;
  239.  
  240.                     ptr++;
  241.  
  242.                     for (j=0; (ptr<&buff[i]); j++)
  243.                         {
  244.                         for (; ((ptr<&buff[i]) && (*ptr==' ')); ptr++);
  245.                         for (ptr2=ptr+1; ((ptr2<&buff[i]) && (*ptr2!=' ')); ptr2++);
  246.                         *ptr2=0;
  247.         /*                printf("%d. %s\n", (short)(ptr2-ptr), ptr);*/
  248.                         switch (j)
  249.                             {
  250.                             case 0:
  251.                                 temp=ptr;
  252.                                 draw_thermometer(atoi(temp));
  253.                                 break;
  254.  
  255.                             case 1:
  256.                                 humid=ptr;
  257.                                 draw_humidity(atoi(humid));
  258.                                 break;
  259.  
  260.                             case 2:
  261.                                 wind_dir=ptr;
  262.                                 break;
  263.     
  264.                             case 4:
  265.                                 wind=ptr;
  266.                                 draw_wind(wind_dir, atoi(wind));
  267.                                 break;
  268.  
  269.                             case 5:
  270.                                 baro_dec=baro_p=ptr;
  271.                                 for (; ((baro_dec<ptr2) && (*baro_dec!='.')); baro_dec++);
  272.                                 *baro_dec++=0;
  273.                                 draw_barometer(atoi(baro_p), atoi(baro_dec));
  274.                                 break;
  275.                             }
  276.                         ptr=ptr2+1;
  277.                         }
  278.  
  279.                     KRfree(buff);
  280.  
  281.                 }
  282.         
  283.             else if(did_stik_init == FALSE)
  284.                 {
  285.                     strcpy(message, "[1][");
  286.                     strcat(message, "Connection NOT possible|Enable STiK");
  287.                     strcat(message, "][  OK  ]");
  288.                     form_alert(1, message);
  289.                 }
  290.  
  291.             draw_win();
  292.             open=0;
  293.             }
  294.         }
  295.     while (endmainloop==FALSE);
  296.  
  297.     close_win();
  298.     delete_win();
  299.  
  300.     close_mfdb();
  301.     gem_close();
  302.     }
  303.  
  304. void init_rsrc(void)
  305.     {
  306.     rsrc_gaddr(R_TREE, menu, &menu_ptr);
  307.     rsrc_gaddr(R_TREE, about, &about_ptr);
  308.     rsrc_gaddr(R_TREE, location, &loc_ptr);
  309.     rsrc_gaddr(R_TREE, help, &help_ptr);
  310. /*
  311.  *    for (i=0; i<last; i++)
  312.  *        {
  313.  *        rsrc_gaddr(R_STRING, i, &ptr);
  314.  *        strings[i]=ptr;
  315.  *        }
  316.  */
  317.     }
  318.  
  319. void gem_init(void)
  320.     {
  321.     short junk;
  322.  
  323.     ap_id = appl_init();
  324.  
  325.     if (!rsrc_load("FORECAST.RSC"))
  326.         {
  327.         form_alert(1,"[1][Error Loading Resource! ][Quit]");
  328.         exit(EXIT_FAILURE);
  329.         }
  330.  
  331.     init_rsrc();
  332.     aes_version = _AESglobal[0];
  333.  
  334.     if (aes_version >= 0x0400)        /* check for MultiTOS*/
  335.     {
  336.         menu_register(ap_id, program_title); /* if it is make the name pretty*/
  337.     }
  338.  
  339.     vdi_handle=graf_handle(&junk,&junk,&junk,&junk);
  340.     for (junk=0; junk<10; junk++)    work_in[junk]=1;
  341.     work_in[10]=2;
  342.     v_opnvwk(work_in, &vdi_handle, work_out);
  343.     vq_extnd(vdi_handle, 1, extn_out);
  344.     vst_alignment(vdi_handle, 0, 1, &junk, &junk);
  345.  
  346.     getcd(0,program_dir);  /* path that antmail is being run from*/
  347.     strcat(program_dir,"\\*.*");       
  348.  
  349.     construct_path(filename,program_dir,"FORECAST.PRF");
  350.     read_prefs_file(filename);
  351.  
  352.     menu_bar(menu_ptr, 1);
  353.     }
  354.  
  355. void gem_close(void)
  356.     {
  357.     menu_bar(menu_ptr, 0);
  358.     v_clsvwk(vdi_handle);
  359.     rsrc_free();
  360.     appl_exit();
  361.     }
  362.